﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <map>
using namespace std;

/*
map构造函数
map<T1, T2> mapTT;//map默认构造函数
map(const map &mp);//拷贝构造函数

map赋值操作
map& operator=(const map &mp);//重载等号操作符
swap(mp);//交换两个集合容器

map大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空

map插入数据元素操作
map.insert(...); //往容器插入元素，返回pair<iterator,bool>
map<int, string> mapStu;
// 第一种 通过pair的方式插入对象
mapStu.insert(pair<int, string>(3, "小张"));
// 第二种 通过pair的方式插入对象
mapStu.inset(make_pair(-1, "校长"));
// 第三种 通过value_type的方式插入对象
mapStu.insert(map<int, string>::value_type(1, "小李"));
// 第四种 通过数组的方式插入值
mapStu[3] = "小刘";
mapStu[5] = "小王";
*/

/*
map删除操作
clear();//删除所有元素
erase(pos);//删除pos迭代器所指的元素，返回下一个元素的迭代器
erase(beg,end);//删除区间[beg,end)的所有元素 ，返回下一个元素的迭代器
erase(keyElem);//删除容器中key为keyElem的对组

map查找操作
find(key);//查找键key是否存在,若存在，返回该键的元素的迭代器；若不存在，返回map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说，要么是0，要么是1。对multimap来说，值可能大于1
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
*/
//7.指定排序规则；
class MyCompareMap
{
public:
	bool operator()(int v1, int v2)const
	{
		return v1 > v2;
	}
};
void testMap()
{
	map<int, int> m;
	//1.插入值的4种方式：
		//第一种：
	m.insert(pair<int, int>(1, 10));
	//第二种，推荐；
	m.insert(make_pair(2, 20));
	//第三种，不推荐；
	m.insert(map<int, int>::value_type(3, 30));
	//第四种，也不推荐；如果保证key存在，那么可以通过[]访问；
	m[4] = 40;

	for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
	{
		cout << "key= " << it->first << " ,value= " << it->second << endl;
	}
	/*key = 1, value = 10
	key = 2, value = 20
	key = 3, value = 30
	key = 4, value = 40*/

	cout << m[5] << endl;//0
	for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
	{
		cout << "key= " << it->first << " ,value= " << it->second << endl;
	}
	/*key = 1, value = 10
	key = 2, value = 20
	key = 3, value = 30
	key = 4, value = 40
	key = 5, value = 0*/
	cout << m[4] << endl;//40

	if (m.empty())
	{
		cout << "空！" << endl;
	}
	else
	{
		cout << "size= " << m.size() << endl;//5
	}

	m.erase(5);
	for (map<int, int>::iterator it = m.begin(); it != m.end(); ++it)
	{
		cout << "key= " << it->first << " ,value= " << it->second << endl;
	}
	/*key = 1, value = 10
	key = 2, value = 20
	key = 3, value = 30
	key = 4, value = 40*/

	map<int, int>::iterator pos = m.find(1);//5 --> 1
	if (pos != m.end())
	{
		cout << "找到：key= " << pos->first << " ,value= " << pos->second << endl;//key = 1, value = 10
	}
	else
	{
		cout << "未找到！" << endl;//未找到！
	}

	//2.map的count，要么是0，要么是1；
	int num = m.count(3);
	cout << "num= " << num << endl;//1

	//3.lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
	map<int, int>::iterator ret = m.lower_bound(3);
	if (ret != m.end())
	{
		cout << "lower_bound中key= " << ret->first << " ,value= " << ret->second << endl;//key = 3, value = 30
	}
	else
	{
		cout << "未找到！" << endl;//未找到！
	}

	//4.upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器
	ret = m.upper_bound(3);
	if (ret != m.end())
	{
		cout << "upper_bound中key= " << ret->first << " ,value= " << ret->second << endl;//key = 4, value = 40
	}
	else
	{
		cout << "未找到！" << endl;//未找到！
	}

	//5.equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器
	pair<map<int, int>::iterator, map<int, int>::iterator> retE = m.equal_range(3);
	if (retE.first != m.end())
	{
		cout << "找到了equal_range中的lower_bound的key=" << retE.first->first << " ,value=" << retE.first->second << endl;
		//key=3 ,value=30
	}
	else
	{
		cout << "未找到！" << endl;
	}

	if (retE.second != m.end())
	{
		cout << "找到了equal_range中的upper_bound的key=" << retE.second->first << " ,value=" << retE.second->second << endl;
		//key=4 ,value=40
	}
	else
	{
		cout << "未找到！" << endl;
	}

	//6.从大到小排序；
	map<int, int, MyCompareMap> mS;
	mS.insert(pair<int, int>(1, 10));
	mS.insert(make_pair(2, 20));
	mS.insert(map<int, int>::value_type(3, 30));
	mS[4] = 40;

	for (map<int, int, MyCompareMap>::iterator it = mS.begin(); it != mS.end(); ++it)
	{
		cout << "key= " << it->first << " ,value= " << it->second << endl;
	}
	/*key = 4, value = 40
	key = 3, value = 30
	key = 2, value = 20
	key = 1, value = 10*/
}

//main328：map集合容器
int main328()
{
	testMap();

	system("pause");
	return EXIT_SUCCESS;
}